package algo3.algothief.modelo;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class Ladron {
	
	private DescripcionDeLadron descripcion;
	private ObjetoRobado objetoRobado;
	private RutaDeEscape rutaDeEscape;
	
//-------------------------------------------------------------------------------------

	public Ladron(DescripcionDeLadron descripcionDeLadron) {
		this.descripcion = descripcionDeLadron;
		this.objetoRobado = null;
		this.rutaDeEscape = null;
	}
	
//-------------------------------------------------------------------------------------

	public Element serializar(Document doc) {
		Element elementoLadron = doc.createElement("Ladron");
		
		Element elementoDescripcion = descripcion.serializar(doc, "Real");
		Element elementoObjeto = objetoRobado.serializar(doc); 
		Element elementoRuta = rutaDeEscape.serializar(doc);
		
		elementoLadron.appendChild(elementoDescripcion);
		elementoLadron.appendChild(elementoObjeto);
		elementoLadron.appendChild(elementoRuta);
					
		return elementoLadron;
	}
		
	public static Ladron hidratar(Document doc, ArrayList<Pais> paisesDelMundo) throws ParserConfigurationException, SAXException, IOException {
		DescripcionDeLadron descripcion = DescripcionDeLadron.hidratar(doc, "Real");
		ObjetoRobado objeto = ObjetoRobado.hidratar(doc, paisesDelMundo);
		RutaDeEscape ruta = RutaDeEscape.hidratar(doc, paisesDelMundo);
		
		Ladron ladronNuevo = new Ladron(descripcion);
		ladronNuevo.definirObjetoRobado(objeto);
		ladronNuevo.definirRutaDeEscape(ruta);
		
		return ladronNuevo;
	}
	
//-------------------------------------------------------------------------------------

	private void definirObjetoRobado(ObjetoRobado objeto) {
		this.objetoRobado = objeto;
	}
	
	private void definirRutaDeEscape(RutaDeEscape ruta) {
		this.rutaDeEscape = ruta;
	}
	
//-------------------------------------------------------------------------------------
	
	public void robar(ObjetoRobado objeto, Mundo mundo) {
		this.objetoRobado = objeto;
		
		Pais paisDeOrigen = objetoRobado.verPaisDeOrigen();
		int cantidadDePaisesAVisitar = objetoRobado.verLaCantidadDePaisesAVisitarPorElLadron();
		this.rutaDeEscape = new RutaDeEscape(paisDeOrigen, mundo, cantidadDePaisesAVisitar);
	}
	
		
	public RutaDeEscape verRutaDeEscape() {
		if (rutaDeEscape != null)
			return this.rutaDeEscape;
		return null;
	}
	
	public Integer verCantidadDePaisesVisitados() {
		if (rutaDeEscape != null)
			return rutaDeEscape.verCantidadDePaisesVisitados();
		return null;
	}
	
	public String verElNombreDelObjetoRobado(){
		if (objetoRobado != null)
			return objetoRobado.verNombre();
		return null;
	}
	
	public String verElNombreDelLadron() {
		return descripcion.verNombre();
	}
	
	public DescripcionDeLadron verDescripcion() {
		return this.descripcion;
	}
}
